package com.unicloud.medical.oss.common;

import com.unicloud.medical.oss.common.model.BucketInfo;
import com.unicloud.medical.oss.common.model.DownloadObject;
import com.unicloud.medical.oss.common.model.FileMetaData;
import com.unicloud.medical.oss.common.model.ObjectInfo;
import com.unicloud.medical.oss.common.model.request.*;

import java.io.InputStream;
import java.util.List;

public interface OSSService {
    /**
     * 存储类型
     */
    String type();

    /**
     * 唯一标识
     */
    String name();

    /**
     * 存储服务地址
     */
    String endpoint();

    /**
     * 代理存储服务地址
     */
    String proxyEndpoint();

    /**
     * 访问地址
     * @param bucketName 桶名称
     * @param objectName 对象名称
     */
    String accessUrl(String bucketName, String objectName);

    /**
     * 查看存储桶是否存在
     */
    Boolean bucketExist(BucketExistRequest request);

    /**
     * 查看存储桶是否存在
     */
    Boolean bucketExist(String bucketName);

    /**
     * 创建存储桶
     */
    Boolean createBucket(CreateBucketRequest request);

    /**
     * 创建存储桶
     */
    Boolean createBucket(String bucketName);

    /**
     * 创建默认策略存储桶
     */
    Boolean createDefaultPolicyBucket(CreateBucketRequest request);

    /**
     * 创建默认策略存储桶
     */
    Boolean createDefaultPolicyBucket(String bucketName);

    /**
     * 设置桶策略
     *
     * @param bucketName 桶名称
     * @param policyText 策略内容
     */
    Boolean setBucketPolicy(String bucketName, String policyText);

    /**
     * 设置默认桶策略
     *
     * @param bucketName 桶名称
     */
    Boolean setDefaultBucketPolicy(String bucketName);

    /**
     * 默认桶策略
     *
     * @param bucketName 桶名称
     */
    String defaultBucketPolicy(String bucketName);

    /**
     * 删除存储桶
     */
    Boolean removeBucket(String bucketName);
    
    /**
     * 删除存储桶
     */
    Boolean removeBucket(DeleteBucketRequest request);

    /**
     * 获取全部桶
     */
    List<BucketInfo> getAllBuckets();

    /**
     * 查看桶内所有的文件对象
     */
    List<ObjectInfo> listAllObjects(String bucketName);

    /**
     * 查看桶内所有的文件对象
     */
    List<ObjectInfo> listAllObjects(ListAllObjectsCurrBucketRequest request);

    /**
     * 查看桶内指定文件夹的文件对象
     */
    List<ObjectInfo> listObjects(String bucketName, String folder);

    /**
     * 查看桶内指定文件夹的文件对象
     */
    List<ObjectInfo> listObjects(ListAllObjectsCurrBucketAndFolderRequest request);

    /**
     * 文件上传
     */
    String uploadObject(String bucketName, String objectName, FileMetaData file);
    String uploadObject(InnerUploadObjectRequest request);

    /**
     * 批量文件上传
     */
    List<String> uploadObjects(String bucketName, String folder, List<FileMetaData> files);
    List<String> uploadObjects(InnerUploadObjectsRequest request);

    /**
     * 本地文件上传
     */
    String uploadLocalObject(UploadLocalObjectRequest request);
    List<String> uploadLocalObjects(UploadLocalObjectsRequest request);

    /**
     * 本地文件上传
     */
    Boolean uploadLocalObject(String bucketName, String objectName, String fileName);

    /**
     * 文件下载
     *
     * @param objectName      文件名称
     */
    DownloadObject downloadObject(String bucketName, String objectName);
    /**
     * 文件下载
     */
    DownloadObject downloadObject(DownloadObjectRequest request);
    /**
     * 批量文件下载
     */
    DownloadObject downloadObjects(String bucketName, String folder, String fileName);
    /**
     * 批量文件下载
     */
    DownloadObject downloadObjects(DownloadObjectsRequest request);

    /**
     * 根据文件名称获取文件
     *
     * @param bucketName
     * @param objectName
     */
    InputStream getObject(String bucketName, String objectName);

    /**
     * 删除
     * @param objectName
     */
    Boolean removeObject(String bucketName, String objectName);
    /**
     * 删除
     */
    String removeObject(RemoveObjectRequest request);

    /**
     * 批量删除
     *
     * @param objectNames
     */
    Boolean removeObjects(String bucketName, List<String> objectNames);
    /**
     * 批量删除
     */
    List<String> removeObjects(RemoveObjectsRequest request);
    /**
     * 删除当前桶当前文件夹的所有文件
     */
    List<String> removeObjects(RemoveObjectsCurrBucketAndFolderRequest request);

    /**
     * 文件迁移
     *
     * @param bucketName
     * @param sourceObjectName
     * @param targetObjectName
     */
    String copyObject(String bucketName, String sourceObjectName, String targetObjectName);
    /**
     * 文件迁移
     */
    String copyObject(CopyObjectRequest request);

    String signedUrl(String bucketName, String objectName);
    String signedUrl(SignedUrlRequest request);
    List<String> signedUrls(String bucketName, List<String> objectNames);
    List<String> signedUrls(SignedUrlsRequest request);

}
